"""
问题:实现 atoi 函数，将字符串转换为整数。
提示：仔细考虑所有可能的输入情况。如果你想挑战一下，请勿查看下方内容，问问自己可能的输入情况有哪些。
注意：本题的要求表述较为模糊（即没有给定输入规范）。你需要自己预先梳理清楚所有输入要求。

思路:
开头的空格
正负符号的处理
溢出处理
非法输入


根据所选代码上下文，您正在处理一个**实现 `atoi` 字符串转整数函数**的问题。这个题目要求你将一个字符串转换为整数，并且需要考虑各种边界条件和输入情况。

---

## ✅ 问题描述

实现一个函数，其行为类似于 C/C++ 标准库中的 `atoi` 函数。该函数应能：

- 跳过字符串开头的空白字符（空格、制表符等）。
- 读取可选的正负号（`+` 或 `-`）。
- 读取后续尽可能多的连续数字字符，并将其转换为整数。
- 如果无法进行有效转换（如没有数字或非法字符），返回 `0`。
- 如果转换结果超出 32 位有符号整数范围 `[−2^31, 2^31 − 1]`，则返回边界值：
  - 若溢出上限，返回 `2^31 − 1 = 2147483647`
  - 若溢出下限，返回 `−2^31 = −2147483648`

---

## 🧠 可能的输入情况（测试用例）

| 输入类型 | 示例 | 说明 |
|----------|------|------|
| 空白开头 | `"   +42"` | 忽略前面所有空白字符 |
| 正负号 | `"+42"`, `"-42"` | 符号只允许出现在数字前 |
| 数字 | `"4193 with words"` | 提取前面的数字部分 `4193` |
| 非法字符 | `"words and 987"` | 没有有效数字，返回 `0` |
| 溢出 | `"-91283472332"` | 超出 32 位整数范围，返回边界值 |
| 空字符串 | `""` | 返回 `0` |
| 只有符号 | `"-"`, `"+ "` | 后面无数字，返回 `0` |

---

## 🧩 Python 实现代码如下：

```python
def my_atoi(s: str) -> int:

    将字符串 s 转换为 32 位有符号整数。

    参数:
        s (str): 输入字符串。

    返回:
        int: 转换后的整数，或 0（无效输入），或边界值（溢出）。

    INT_MIN, INT_MAX = -2**31, 2**31 - 1
    index = 0
    n = len(s)

    # 1. 跳过前导空格
    while index < n and s[index] == ' ':
        index += 1

    # 2. 判断是否为空字符串或全是空格
    if index == n:
        return 0

    # 3. 处理符号
    sign = 1
    if s[index] in '+-':
        if s[index] == '-':
            sign = -1
        index += 1

    # 4. 读取数字部分
    num = 0
    while index < n and s[index].isdigit():
        digit = int(s[index])

        # 5. 溢出判断（提前检查是否会超出范围）
        if num > (INT_MAX - digit) // 10:
            return INT_MIN if sign == -1 else INT_MAX

        num = num * 10 + digit
        index += 1

    # 6. 应用符号并返回结果
    return sign * num
```


---

## 📌 示例运行

```python
print(my_atoi("42"))               # 输出: 42
print(my_atoi("   -42"))           # 输出: -42
print(my_atoi("4193 with words")) # 输出: 4193
print(my_atoi("words and 987"))    # 输出: 0
print(my_atoi("-91283472332"))     # 输出: -2147483648（溢出下限）
print(my_atoi("+"))                # 输出: 0（只有符号）
print(my_atoi(""))                 # 输出: 0（空字符串）
```


---

## ⚠️ 关键点说明

- **前导空格处理**：使用循环跳过所有空格字符。
- **符号处理**：记录符号后继续向后读取。
- **逐位构建数字**：通过 `num = num * 10 + digit` 构建数字。
- **溢出检测技巧**：
  ```python
  if num > (INT_MAX - digit) // 10:
      return INT_MIN or INT_MAX
  ```

  这样可以避免实际溢出后再判断，提升性能和安全性。
- **最终结果加上符号**：`return sign * num`

---

## ✅ 时间与空间复杂度分析

- **时间复杂度**：`O(n)`，其中 `n` 是字符串长度。每个字符最多访问一次。
- **空间复杂度**：`O(1)`，仅使用常数级额外空间。

---

## ✅ 总结

本题考察了对字符串解析、边界条件处理、以及整数溢出判断的能力。关键在于：

- 全面考虑各种输入情况；
- 提前判断溢出；
- 使用简洁高效的逻辑实现核心功能。

这道题非常适合用于练习如何写健壮、安全、符合规范的代码。
"""


def my_atoi(s: str) -> int:
    """
    将字符串 s 转换为 32 位有符号整数。

    参数:
        s (str): 输入字符串。

    返回:
        int: 转换后的整数，或 0（无效输入），或边界值（溢出）。
    """

    INT_MIN, INT_MAX = -2**31, 2**31 - 1
    index = 0
    n = len(s)

    # 1.跳过前导空格 前导空格处理：使用循环跳过所有空格字符。
    while index < n and s[index] == ' ':
        index += 1

    # 2.判断是否为空字符串或全是空格
    if index == n:
        return 0

    # 3.处理符号 符号处理：记录符号后继续向后读取。
    sign = 1
    if s[index] in '+-':
        if s[index] == '-':
            sign = -1
        index+= 1

    # 4.读取数字部分 逐位构建数字：通过 num = num * 10 + digit 构建数字。
    num = 0
    while index < n and s[index].isdigit():
        digit = int(s[index])

        # 5.溢出判断(提前检查是否会超出范围)
        if num > (INT_MAX - digit) // 10:
            return INT_MIN if sign == -1 else INT_MAX
        num = num * 10 + digit
        index += 1

    # 6.应用符号并返回结果
    return sign * num



if __name__ == "__main__":
 print(my_atoi("42"))               # 输出: 42
 print(my_atoi("   -42"))           # 输出: -42
 print(my_atoi("4193 with words")) # 输出: 4193
 print(my_atoi("words and 987"))    # 输出: 0
 print(my_atoi("-91283472332"))     # 输出: -2147483648（溢出下限）
 print(my_atoi("+"))                # 输出: 0（只有符号）